#ifndef __PointStruct_H__
#define __PointStruct_H__

#include "tlm.h"

#ifndef nullptr
  #define nullptr 0
#endif

class PointStruct { //{{{
public:
  // 默认构造函数
  PointStruct();
  // 带参数的构造函数
  PointStruct(sc_dt::sc_uint<16> x, sc_dt::sc_uint<16> y, sc_dt::sc_uint<8> z);
  
  // 重载 << 运算符
  friend std::ostream& operator<<(std::ostream& os, const PointStruct& point);

public:
  void setFeature(int idx, sc_dt::sc_uint<16> value);
  sc_dt::sc_uint<16> getFeature(int idx) const;
  
  void print() const { std::cout << *this << std::endl; }
  void setX(sc_dt::sc_uint<16> x) { x_crd = x; }
  void setY(sc_dt::sc_uint<16> y) { y_crd = y; }
  void setZ(sc_dt::sc_uint<8> z)  { z_crd = z; }
  sc_dt::sc_uint<8> getZ() const { return z_crd; }
  sc_dt::sc_uint<16> getY() const { return y_crd; }
  sc_dt::sc_uint<16> getX() const { return x_crd; }

  // 判断与传入的 point 在 z_crd, y_crd 和 x_crd 上是否相同
  bool isSameZcrd(const PointStruct& point) const;
  bool isSameYcrd(const PointStruct& point) const;
  bool isSameXcrd(const PointStruct& point) const;

public:
  sc_dt::sc_uint<16> x_crd;
  sc_dt::sc_uint<16> y_crd;
  sc_dt::sc_uint<8>  z_crd;
  sc_dt::sc_uint<16> feature[6];
}; //}}}

//SC_MODULE(PointStructProducer) { //{{{
class PointStructProducer: public sc_core::sc_module{
public:
  //SC_HAS_PROCESS + PointStructConsumer = SC_CTOR
  SC_HAS_PROCESS(PointStructProducer);

  PointStructProducer(
    sc_core::sc_module_name name,            	
    const unsigned int      ID, 
    unsigned int            send_point_num      
  ):
    sc_module           (name),
    m_ID                (ID),
    m_send_point_num    (send_point_num)
  {
    SC_THREAD(produce);
  }

  void produce();
  sc_core::sc_port<sc_core::sc_fifo_out_if<PointStruct> > out;

private:
  const unsigned int  m_ID; 
  unsigned int        m_send_point_num;
}; //}}}

SC_MODULE(PointStructConsumer) { //{{{
public:
  SC_CTOR(PointStructConsumer) {
    SC_THREAD(consume);
  }
  void consume();

  sc_core::sc_port<sc_core::sc_fifo_in_if<PointStruct> > in;

private:
  PointStruct *point_entry[8];
}; //}}}

/*
int sc_main(int argc, char* argv[]) { //{{{
  sc_core::sc_fifo<PointStruct> fifo; // FIFO 缓冲区

  PointStructProducer producer("Producer");
  PointStructConsumer consumer("Consumer");

  // 连接模块
  producer.out(fifo);
  consumer.in(fifo);

  // 启动仿真
  sc_core::sc_start();

  return 0;
} //}}}
*/
#endif /* __PointStruct_H__ */
